/**
 * 递归
 * 函数内部调用自身的编程技巧就称作是递归。
 */


// 求 n 的阶乘
function factorial(n) {
    if (n < 0) {
        // 创建一个Error实例
        let e = new Error('负数没有阶乘');
        // 抛出Error实例
        throw e; // throw 会导致函数结束(相应的栈帧也会从方法调用栈中弹出)
    } else if (n == 0 || n == 1) {
        // 数学中规定 0 和 1 的阶乘都是 1
        return 1;
    } else {
        // n! = n * (n-1)!
        let r = n * factorial(n - 1); // 在函数内部调用函数自己
        return r;
    }
}

// factorial(5) : 5 * factorial( 5 - 1 )
// factorial(4) : 4 * factorial( 4 - 1 )
// factorial(3) : 3 * factorial( 3 - 1 )
// factorial(2) : 2 * factorial( 2 - 1 )
// factorial(1) : 1
let result = factorial(5);
console.log(result);